#ifndef POINT_H
#define POINT_H

/**
 * \file Point.h
 * \brief Fichier contenant la déclaration de la classe Point
 */

class Point
{

        /* \class Point
         * \brief Classe représentant un point du nuage de points acquis par lidar terrestre. Notament ses coordonnées et sa couleur.
         */

  private :

        float X;                                                                                                                        /*!<Abscisse du point.*/
        float Y;                                                                                                                        /*!<Ordonnée du point.*/
        float Z;                                                                                                                        /*!<Hauteur du point.*/

                float R;                                                                                                                        /*!<Intensité du canal rouge du point.*/
        float G;                                                                                                                        /*!<Intensité du canal vert du point.*/
        float B;                                                                                                                        /*!<Intensité du canal bleu du point.*/

  public :

                /*!
        *  \brief Constructeur de la classe Point
        *
        *  Constructeur de la classe Point
        */
        Point(void);

                /*!
                 *  \brief Constructeur de la classe Point
                 *
                 *  Constructeur de la classe Point
                 *
                 *  \param _x : Abcsisse du point à créer.
                 *  \param _y : Ordonnée du point à créer.
                 *  \param _z : Hauteur du point à créer.
                 *  \param _r : Intensité du canal rouge du point à créer.
                 *  \param _g : Intensité du canal vert du point à créer.
                 *  \param _b : Intensité du canal bleu du point à créer.
        */
        Point(float _x, float _y, float _z, float _r = 0, float _g = 0, float _b = 0);
		
                /*!
                 *  \brief Constructeur de la classe Point
                 *
         *  Constructeur de la classe Point
                 *
                 *  \param _p : Le point ainsi créer sera un doublon du point _p.
        */
        Point(const Point & _p);

                /*!
                 *  \brief Destructeur de la classe Point
                 *
         *  Destructeur de la classe Point
        */
        ~Point();


                /*!
                 *  \brief Modificateur de la classe Point
                 *
         *  Modificateur de l'abscisse de la classe Point
                 *
                 *  \param _x : Affecte _x à l'abscisse du point.
                 *
                 *  \return : void
        */
        void setX(float _x);

                /*!
                 *  \brief Modificateur de la classe Point
                 *
         *  Modificateur de l'ordonnée de la classe Point
                 *
                 *  \param _y : Affecte _y à l'ordonnée du point.
                 *
                 *  \return : void
        */
        void setY(float _y);

                /*!
                 *  \brief Modificateur de la classe Point
                 *
         *  Modificateur de la hauteur de la classe Point
                 *
                 *  \param _z : Affecte _z à la hauteur du point.
                 *
                 *  \return : void
        */
        void setZ(float _z);

                /*!
                 *  \brief Modificateur de la classe Point
                 *
         *  Modificateur de la classe Point
                 *
                 *  \param _x : Affecte _x à l'abscisse du point.
                 *  \param _y : Affecte _y à l'ordonnée du point.
                 *  \param _z : Affecte _z à la hauteur du point.
                 *
                 *  \return : void
        */
                void setXYZ(float _x, float _y, float _z);


                /*!
                 *  \brief Modificateur de la classe Point
                 *
         *  Modificateur de la classe Point
                 *
                 *  \param _r : Affecte _r à l'intensité du canal rouge du point.
                 *
                 *  \return : void
        */      
                void setR(float _r);

                /*!
                 *  \brief Modificateur de la classe Point
                 *
         *  Modificateur de la classe Point
                 *
                 *  \param _g : Affecte _g à l'intensité du canal vert du point.
                 *
                 *  \return : void
        */      
        void setG(float _g);
        
                /*!
                 *  \brief Modificateur de la classe Point
                 *
         *  Modificateur de la classe Point
                 *              
                 *  \param _b : Affecte _b à l'intensité du canal bleu du point.
                 *
                 *  \return : void
        */      
                void setB(float _b);

                /*!
                 *  \brief Modificateur de la classe Point
                 *
         *  Modificateur de la classe Point
                 *
                 *  \param _r : Affecte _r à l'intensité du canal rouge du point.
                 *  \param _g : Affecte _g à l'intensité du canal vert du point.
                 *  \param _b : Affecte _b à l'intensité du canal bleu du point.
                 *
                 *  \return : void
        */              
                void setRGB(float _r, float _g, float _b);
       

                /*!
                 *  \brief Accesseur de la classe Point
                 *
         *  Accesseur de l'abscisse de la classe Point
                 *      
                 *      \return : Renvoie l'abcsisse du point.
        */      
        float getX(void);
        
                /*!
                 *  \brief Accesseur de la classe Point
                 *
         *  Accesseur de l'ordonnée de la classe Point
                 *      
                 *      \return : Renvoie l'ordonnée du point.
        */      
                float getY(void);

                /*!
                 *  \brief Accesseur de la classe Point
                 *
         *  Accesseur de la hauteur de la classe Point
                 *      
                 *      \return : Renvoie la hauteur du point.
        */      
        float getZ(void);

                /*!
                 *  \brief Accesseur de la classe Point
                 *
         *  Accesseur de la couleur de la classe Point
                 *      
                 *      \return : Renvoie l'intensité du canal rouge du point.
        */      
                float getR(void);

                /*!
                 *  \brief Accesseur de la classe Point
                 *
         *  Accesseur de la couleur de la classe Point
                 *      
                 *      \return : Renvoie l'intensité du canal vert du point.
        */      
        float getG(void);

                /*!
                 *  \brief Accesseur de la classe Point
                 *
         *  Accesseur de la couleur de la classe Point
                 *      
                 *      \return : Renvoie l'intensité du canal bleu du point.
        */      
        float getB(void);


                /*!
                 *  \brief Affiche dans la console les coordonnées (x,y,z) du point.
                 *
         *  Affiche dans la console les coordonnées (x,y,z) du point. Utile pour les tests.
                 *
                 *  \return : void
        */      
                void printPoint();

                /*!
                 *  \brief Surcharge de d'opérateur.
                 *
         *  Surcharge de l'opérateur =.
                 *
                 *  \param _p : Point à copier.
                 *
                 *  \return : Point
        */
        Point &operator= (const Point &_p);

                /*!
                 *  \brief Surcharge de d'opérateur.
                 *
         *  Surcharge de l'opérateur ==.
                 *
                 *  \param _p : Point avec lequel tester l'égalité.
                 *
                 *  \return : bool
        */
        bool operator== (const Point & _p);

                /*!
                 *  \brief Surcharge de d'opérateur.
                 *
         *  Surcharge de l'opérateur !=.
                 *
                 *  \param _p : Point avec lequel tester l'égalité.
                 *
                 *  \return : bool
        */
                bool operator!= (const Point & _p);

};

#endif

